﻿# -*- coding: utf-8 -*-
from graphviz import Digraph

# 创建有向图，设置横向布局
dot = Digraph()
dot.attr(rankdir='LR', newrank='true')

# 定义节点样式
node_style = {
    'fontname': 'SimSun',  # 中文字体
    'fontsize': '12',
    'shape': 'ellipse',
    'style': 'filled',
    'fillcolor': 'white',
    'color': 'black'
}

# 添加节点和连接关系
with dot.subgraph(name='left') as s:
    s.node('start', '中文素材文本', ​**​node_style)
    s.node('ngram', 'N-Gram字符数据', shape='box', ​**​node_style)
    s.edge('start', 'ngram')

# 中间处理分支
with dot.subgraph(name='mid') as s:
    s.attr(rank='same')
    s.node('brown', '布朗聚类', ​**​node_style)
    s.node('kmeans', 'K-Means', ​**​node_style)
    s.node('nn', '神经网络语\n言模型', ​**​node_style)  # 强制换行
    s.edges([('ngram', 'brown'), ('ngram', 'kmeans'), ('ngram', 'nn')])

# 右侧聚合部分
with dot.subgraph(name='right') as s:
    s.attr(rank='same')
    s.node('cluster', '聚类特征表示', ​**​node_style)
    s.node('vector', '向量特征表示', ​**​node_style)
    s.edge('brown', 'cluster')
    s.edge('kmeans', 'cluster')
    s.edge('nn', 'vector')

# 最终节点
with dot.subgraph(name='final') as s:
    s.node('result', '特征表示', shape='box', ​**​node_style)
    s.edge('cluster', 'result')
    s.edge('vector', 'result')

# 输出文件
dot.format = 'png'
dot.render('text_process_flow', view=True, cleanup=True)